package com.adil.base.collections.set;

import java.util.HashSet;
import java.util.Iterator;

/**
 * @description: TODO
 * @author: Adil
 * @date: 2024/4/24
 */
public class HashSetDemo {
    public static void main(String[] args) {
        //HashSet 是 Set 接口的实现类，它不允许重复的元素，因此，它可以用来存储元素，但不保证元素的顺序。
        //HashSet 实现了 Set 接口，因此，它支持 add()、remove()、contains() 等操作。
        //HashSet 是一个无序的集合，因此，当我们遍历 HashSet 时，元素的顺序是不确定的。
        //HashSet 是一个线程不安全的集合，因此，在多线程环境下，需要使用 Collections.synchronizedSet() 方法来包装 HashSet。
        //HashSet 的初始容量是 16，当元素个数超过 16 时，容量会自动扩充为原来的 2 倍。
        //HashSet 的底层是哈希表，因此，它的查询、插入、删除操作的时间复杂度是 O(1)。
        //HashSet 扩容原理：当HashSet中的元素个数超过了负载因子（默认值0.75）*capacity时，HashSet会自动扩充容量，扩充的容量大小为原来的2倍。
        //HashSet 不会自动去除重复元素，如果需要去除重复元素，可以使用LinkedHashSet。
        //HashSet 不是同步的，因此，在多线程环境下，需要使用 Collections.synchronizedSet() 方法来包装 HashSet。
        //HashSet 允许 null 元素，但只能有一个 null 元素。
        //HashSet 不是一个排序的集合，因此，不能使用 Collections.sort() 方法来排序。
        //HashSet 不是一个有序集合，因此，不能使用 Collections.binarySearch() 方法来查找元素。
        //HashSet 不是一个固定集合，因此，不能使用 Arrays.asList() 方法来创建集合。
        //HashSet 不是一个递归集合，因此，不能使用自身作为元素。
        //HashSet 不是一个线程安全的集合，因此，在多线程环境下，需要使用 Collections.synchronizedSet() 方法来包装 HashSet。
        //HashSet 不是一个序列化的集合，因此，不能使用 ObjectOutputStream 来序列化。
        //HashSet 不是一个快速失败的集合，因此，在迭代器的使用中，如果集合结构发生变化，迭代器将抛出 ConcurrentModificationException 异常。
        //HashSet 应用场景：
        //1、HashSet 适合于集合中元素不重复的场景。
        //2、HashSet 适合于集合中元素数量不多的场景。
        //3、HashSet 适合于集合中元素随机访问的场景。
        //4、HashSet 适合于集合中元素遍历的场景。
        //5、HashSet 适合于集合中元素快速查找的场景。
        //6、HashSet 适合于集合中元素快速删除的场景。
        //7、HashSet 适合于集合中元素快速添加的场景。
        //8、HashSet 适合于集合中元素快速判断是否存在的场景。
        //9、HashSet 适合于集合中元素快速遍历的场景。
        //HashSet 示列：
        //1、HashSet 示例：
        HashSet<String> set = new HashSet<>();
        set.add("apple");
        set.add("banana");
        set.add("orange");   // 重复元素
        set.add(null);        // null 元素
        System.out.println(set); // [apple, banana, orange, null]
        //2、HashSet 遍历示例：
        for (String str : set) {
            System.out.println(str);
        }
        //3、HashSet 遍历示例：
        Iterator<String> iterator = set.iterator();
        while (iterator.hasNext()) {
            String str = iterator.next();
            System.out.println(str);
        }
        //4、HashSet 遍历示例：
        for (Object obj : set.toArray()) {
            System.out.println(obj);
        }
        //5、HashSet 遍历示例：
        for (String str : set) {
            if (str.equals("banana")) {
                set.remove(str);
            }
        }
        System.out.println(set); // [apple, orange, null]

    }
}
